////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////@

// Ακολουθούν μέθοδοι που αφορούν στις συνεδρίες.

// Η μέθοδος "sinedriaBoxJQL" επιστρέφει jQuery element list για τα DOM elements που
// αφορούν κουτάκια τού παίκτη της συνεδρίας σε όλες τις περιοχές και στα τραπέζια.

Sinedria.prototype.sinedriaBoxJQL = function(topos) {
	return Pektis.pektisBoxJQL(this.pektis, topos);
}

// Η μέθοδος "sinedriaBoxEntosJQL" επιστρέφει jQuery element list για τα DOM elements που
// αφορούν κουτάκια του παίκτη τής συνεδρίας όπου εμφανίζεται ως παίκτης τραπεζιού.

Sinedria.prototype.sinedriaBoxEntosJQL = function() {
	return Pektis.pektisBoxJQL(this.pektis, {
		entos: 1,
	});
}

// Η μέθοδος "sinedriaBoxEktosJQL" επιστρέφει jQuery element list για τα DOM elements που
// αφορούν κουτάκια του παίκτη τής συνεδρίας όπου εμφανίζεται εκτός από παίκτης τραπεζιού.

Sinedria.prototype.sinedriaBoxEktosJQL = function() {
	return Pektis.pektisBoxJQL(this.pektis, {
		ektos: 1,
	});
}

Sinedria.prototype.sinedriaRebelosJQL = function() {
	return $('#RB' + this.pektis.jqsel());
}

Sinedria.prototype.sinedriaRebelosAddDOM = function() {
	Skiniko.fetchPektis(this.pektis).pektisRebelosAddDOM();
	return this;
}

Sinedria.prototype.sinedriaRebelosDelDOM = function() {
	this.sinedriaRebelosJQL().stop().fadeOut(function() {
		$(this).remove();
	});
	return this;
}

Sinedria.prototype.sinedriaTheatisJQL = function() {
	var slogin = this.pektis.jqsel();
	return $('#TH' + slogin + ',#SH' + slogin);
}

Sinedria.prototype.sinedriaTheatisDelDOM = function() {
	this.sinedriaTheatisJQL().stop().fadeOut(function() {
		$(this).remove();
	});
	return this;
}

// Η μέθοδος "sinedriaAddDOM" εισάγει την συνεδρία στο DOM. Η μέθοδος ετοιμάζει
// παράλληλα και DOM elements που αφορούν στον σχετικό παίκτη και εντάσσονται στις
// στις περιοχές των νεοφερμένων (NF), των θεατών (TH) και των περιφερομένων (RB).
// Η μέθοδος επιστρέφει την συνεδρία.

Sinedria.prototype.sinedriaAddDOM = function() {
	var pektis, trapezi, anazitisi;

	this.sinedriaBoxEktosJQL().remove();
	pektis = Skiniko.fetchPektis(this.pektis);
	trapezi = this.isTrapezi();
	if (trapezi) {
		trapezi = Skiniko.fetchTrapezi(trapezi);
		if (this.isTheatis()) {
			Skiniko.fetchTrapezi(trapezi.kodikos).trapeziJQL().akrivosEna().trapeziTheatisAddDOM(this.pektis);
			if (trapezi.isEgo()) trapezi.tsoxaTheatisAddDOM(this.pektis);
		}
	}
	else pektis.pektisRebelosAddDOM();

	// Αρχικά θεωρούμε ότι ο παίκτης αλητεύει και αμέσως μετά ακυρώνουμε την αλητεία
	// από το τραπέζι στο οποίο όντως παίζει.

	pektis.pektisBoxJQL({
		entos: true,
		tsoxa: true,
	}).addClass('pektisAlitevi').pektisOnlineFixDOM(this.pektis);
	if (this.isPektis()) {
		Trapezi.trapeziThesiJQL(this.trapezi, this.thesi).removeClass('pektisAlitevi');
		if (trapezi.isEgo()) $('#tsoxaPektis' + Prefadoros.tsoxa.thesiMap(this.thesi)).
			find('.pektisBox').removeClass('pektisAlitevi');
	}

	if (globals.toraServer() - this.isodos < Prefadoros.niofertosTimeout)
		pektis.pektisDOM('NF').pektisFixDOM(this.pektis).prependTo('#niofertosArea');

	this.sinedriaProsklisiJQL().prosklisiOnlineFixDOM(this.pektis);

	anazitisi = pektis.anazitisi();
	if ((!this.sinedriaAnazitisiJQL().length) && anazitisi.match())
		$('#sxesiArea').prepend(anazitisi.anazitisiDOM()).zevra();
	this.sinedriaAnazitisiJQL().anazitisiOnlineFixDOM(this.pektis);

	this.sinedriaProfinfoJQL().profinfoOnlineFixDOM(this.pektis);

	return this;
}

Sinedria.prototype.sinedriaDelDOM = function(amesa) {
	var pektis, azel;

	pektis = Skiniko.fetchPektis(this.pektis);
	if (amesa) this.sinedriaBoxEktosJQL().remove();
	else this.sinedriaBoxEktosJQL().stop().addClass('pektisOffline').fadeOut(function() {
		$(this).remove();
	});

	pektis.pektisBoxJQL({
		entos: true,
		tsoxa: true,
	}).removeClass('pektisAlitevi').pektisOnlineFixDOM(this.pektis);
	this.sinedriaProsklisiJQL().prosklisiOnlineFixDOM(this.pektis);
	this.sinedriaAnazitisiJQL().anazitisiOnlineFixDOM(this.pektis);

	azel = this.sinedriaAnazitisiJQL();
	if (azel.length && (!pektis.anazitisi().match())) {
		azel.remove();
		$('#sxesiArea').zevra();
	}

	this.sinedriaProfinfoJQL().profinfoOnlineFixDOM(this.pektis);

	return this;
}

Sinedria.niofertosDelDOM = function(login) {
	$('#NF' + Client.jqsel(login)).fadeOut(function() {
		$(this).remove();
	});

	return this;
}

// Αν κάποια κίνηση προκαλεί σημαντική αλλαγή στη θέση κάποιου παίκτη, τότε είναι καλό
// να καλέσουμε την "alagiThesisFixDOM" με παραμέτρους τις συνεδρίες θέσης πριν και
// μετά την αλλαγή, πράγμα που σημαίνει ότι θα πρέπει να κρατάμε πρόχειρη συνεδρία θέσης
// πριν την αλλαγή. Ως πρώτη παράμετρο περνάμε τη συνεδρία θέσης πριν την αλλαγή. Αν δεν
// περάσουμε δεύτερη παράμετρο, η σύγκριση γίνεται με τα στοιχεία θέσης τής ανά χείρας
// συνεδρίας, αλλιώς η σύγκριση γίνεται με τα στοιχεία θέσης τής συνεδρίας που περάσαμε
// ως δεύτερη παράμετρο.

Sinedria.prototype.alagiThesisFixDOM = function(prin, tora) {
	var trapeziPrin, trapeziTora, jql;

	if (tora === undefined) tora = this;
	if (tora.sinedriaThesiSame(prin)) return this;

	trapeziPrin = Skiniko.isTrapezi(prin.trapezi);
	trapeziTora = Skiniko.isTrapezi(tora.trapezi);

	if (trapeziPrin) {
		if (prin.trapezi != tora.trapezi) {
			trapeziPrin.trapeziJQL().trapeziDataFixDOM(trapeziPrin);
			if (this.isEgo()) {
				trapeziPrin.pexnidiCleanup().trapeziBoxJQL().removeClass('trapeziTheatis');
				Trapezi.tsoxaClearDOM().addClass('tsoxaKeni');
			}
		}
		if (prin.isTheatis() && (tora.oxiTheatis() || (tora.trapezi != prin.trapezi))) {
			this.sinedriaTheatisJQL().fadeOut(function() {
				$(this).remove();
			});
		}
		else if (trapeziPrin.pektis(prin.thesi) != this.pektis) trapeziPrin.trapeziPektisFixDOM(prin.thesi);
	}

	if (trapeziTora) {
		jql = trapeziTora.trapeziJQL();
		jql.trapeziDataFixDOM(trapeziTora);
		if (this.isEgo()) {
			if ((tora.trapezi != prin.trapezi) || (tora.thesi != prin.thesi)) trapeziTora.tsoxaDOM();
		}

		if (tora.theatis) {
			if (prin.oxiTheatis() || (tora.trapezi != prin.trapezi)) {
				jql.trapeziTheatisAddDOM(this.pektis);
				if (trapeziTora.isEgo() && (Prefadoros.ego.login != this.pektis))
					trapeziTora.tsoxaTheatisAddDOM(this.pektis);
			}
			if (this.isEgo()) {
				jql.find('.trapeziBox').addClass('trapeziTheatis');
				$('#tsoxa').addClass('tsoxaTheatis').find('.tsoxaData').addClass('theatis');
			}
		}
		else {
			trapeziTora.trapeziPektisFixDOM(tora.thesi);
			if (this.isEgo()) {
				jql.find('.trapeziBox').removeClass('trapeziTheatis');
				$('#tsoxa').removeClass('tsoxaTheatis').find('.tsoxaData').removeClass('theatis');
			}
		}
	}
	else if (prin.trapezi && this.isEgo()) Trapezi.tsoxaClearDOM().addClass('tsoxaKeni');

	jql = this.sinedriaRebelosJQL();
	if (this.isTrapezi() && jql.length) this.sinedriaRebelosDelDOM();
	if (this.oxiTrapezi() && (!jql.length)) this.sinedriaRebelosAddDOM();

	this.sinedriaBoxJQL({entos:1, tsoxa:1}).addClass('pektisAlitevi');
	if (this.isPektis()) {
		jql = Trapezi.trapeziThesiJQL(this.trapezi, this.thesi);
		if (Prefadoros.ego.sinedria.trapezi == this.trapezi) jql = jql.add(this.sinedriaBoxJQL({tsoxa:1}));
		jql.removeClass('pektisAlitevi');
	}

	Skiniko.fetchPektis(this.pektis).pektisFixDOM();
	Prefadoros.ego.miaPrefaFixDOM();

	return this;
}

// Η μέθοδος "bikePektisAlarm" κάνει εμφανή την είσοδο του παίκτη
// σε κάποιο τραπέζι. Η μέθοδος εφαρμόζεται στη σχετική συνεδρία
// με στοιχεία θέσης ΜΕΤΑ την είσοδο στο τραπέζι και δέχεται ως
// παράμετρο το τραπέζι με στοιχεία παικτών ΠΡΙΝ την είσοδο τού
// παίκτη στο τραπέζι. Η μέθοδος επιστρέφει true εφόσον έγινε
// εμφανής η είσοδος του παίκτη στο τραπέζι.

Sinedria.prototype.bikePektisAlarm = function(trapezi) {
	// Αν ο παίκτης εισήλθε ως θεατής δεν κάνουμε καμία ενέργεια.

	if (this.isTheatis()) return false;

	// Αν στην επίμαχη θέση καθόταν ήδη ο ίδιος παίκτης, δεν δίνεται
	// καμία ένδειξη εισόδου.

	if (trapezi.pektis(this.thesi) == this.pektis) return false;

	// Εντοπίζουμε τη θέση στο τραπέζι και αφαιρούμε τυχόν άλλη ένδειξη
	// εισόδου/εξόδου που ίσως βρίσκεται σε εξέλιξη γι' αυτή τη θέση.

	Trapezi.trapeziThesiJQL(this.trapezi, this.thesi).akrivosEna().
	bikeBgikeAlarmIcon('hi.png', 'pektisBikeAlarmIcon', 44);

	// Αν το τραπέζι στο οποίο εισέρχεται η συνεδρία δεν είναι το
	// δικό μας τραπέζι, δεν κάνουμε καμία περαιτέρω ενέργεια.

	if (!Prefadoros.ego.trapezi) return false;
	if (this.trapezi != Prefadoros.ego.trapezi.kodikos) return false;

	// Ο παίκτης εισήλθε στο δικό μας τραπέζι, επομένως δίνουμε και
	// ηχητικό σήμα.

	Client.sound.doorbell();
	Trapezi.tsoxaThesiMapJQL(this.thesi).find('.pektisBox').
	bikeBgikeAlarmIcon('hi.png', 'tsoxaBikeAlarmIcon', 54);
	return true;
}

// Η μέθοδος "bgikePektisAlarm" κάνει εμφανή την έξοδο κάποιου παίκτη από
// τη θέση του στο τραπέζι. Η μέθοδος εφαρμόζεται σε συνεδρία με στοιχεία
// θέσης ΠΡΙΝ την έξοδο από το τραπέζι. Η μέθοδος επιστρέφει true εφόσον
// έγινε εμφανής η έξοδος του παίκτη από το τραπέζι.

Sinedria.prototype.bgikePektisAlarm = function(sinedriaTora) {
	var hjql;

	// Αν ο παίκτης δεν ήταν παίκτης στο τραπέζι δεν κάνουμε καμία
	// ενέργεια.

	if ((!this.trapezi) || this.theatis) return false;

	// Εντοπίζουμε τη θέση στο τραπέζι και αφαιρούμε τυχόν άλλη ένδειξη
	// εισόδου/εξόδου που ίσως βρίσκεται σε εξέλιξη γι' αυτή τη θέση.

	Trapezi.trapeziThesiJQL(this.trapezi, this.thesi).akrivosEna().
	bikeBgikeAlarmIcon(sinedriaTora && sinedriaTora.isTheatis() ?
		'theatis.png' : 'bye.gif', 'pektisBgikeAlarmIcon', 44);

	// Αν το τραπέζι από το οποίο εξέρχεται η συνεδρία δεν είναι το
	// δικό μας τραπέζι, δεν κάνουμε καμία περαιτέρω ενέργεια.

	if (!Prefadoros.ego.trapezi) return false;
	if (this.trapezi != Prefadoros.ego.trapezi.kodikos) return false;

	// Ο παίκτης εξήλθε από το δικό μας τραπέζι, επομένως δίνουμε και
	// ηχητικό σήμα.

	Client.sound.blioup();
	Trapezi.tsoxaThesiMapJQL(this.thesi).find('.pektisBox').
	bikeBgikeAlarmIcon(sinedriaTora && sinedriaTora.isTheatis() ?
		'theatis.png' : 'bye.gif', 'tsoxaBgikeAlarmIcon', 54);

	return true;
}

jQuery.fn.bikeBgikeAlarmIcon = function(ico, klasi, width) {
	return $(this).each(function() {
		$(this).find('.pektisAlarmIcon').remove();
		$('<img>').addClass('pektisAlarmIcon ' + klasi).attr({src: 'images/endixi/' + ico}).
		appendTo($(this)).animate({
			width: width + 'px',
		}, 600, 'easeOutBounce', function() {
			$(this).delay(3000).fadeOut(1000, function() {
				$(this).remove();
			});
		});
	});
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////@

// Η μέθδος "sinedriaThesiCopy" εφαρμόζεται σε πρόχειρη συνεδρία και σκοπό έχει να θέσει
// τα στοιχεία θέσης ίδια με τα στοιχεία θέσης τής συνεδρίας που περνάμε ως παράμετρο.
// Τα στοιχεία τίθενται με κάπως αυστηρό τρόπο, ώστε να μπορεί να γίνει ασφαλής σύγκριση
// με άλλο στιγμιότυπο θέσης της συνεδρίας.

Sinedria.prototype.sinedriaThesiCopy = function(sinedria) {
	var i;

	// Πρώτα "αδειάζουμε" την πρόχειρη συνεδρία από τυχόν properties.

	for (i in this) delete this[i];

	// Αντιγράφουμε τώρα τον παίκτη και τα στοιχεία θέσης.

	this.pektis = sinedria.pektis;
	if (sinedria.hasOwnProperty('trapezi')) this.trapezi = sinedria.trapezi;
	if (sinedria.hasOwnProperty('thesi')) this.thesi = sinedria.thesi;
	if (sinedria.hasOwnProperty('theatis')) this.theatis = sinedria.theatis;

	return this;
}

// Ελέγχουμε με μεγάλη προσοσχή αν τα στοιχεία θέσης της ανά χείρας συνεδρίας
// είναι ίδια με τα στοιχεία θέσης τής συνεδρίας την οποία περνάμε ως παράμετρο.
// Η μέθοδος επιστρέφει true αν οι δύο συνεδρίες έχουν τα ίδια στοιχεία θέσης,
// αλλιώς επιστρέφει false.

Sinedria.prototype.sinedriaThesiDif = function(sinedria) {
	var x1, x2;

	x1 = this.hasOwnProperty('trapezi') ? parseInt(this.trapezi) : 0;
	x2 = sinedria.hasOwnProperty('trapezi') ? parseInt(sinedria.trapezi) : 0;
	if (x1 != x2) return true;

	x1 = this.hasOwnProperty('thesi') ? parseInt(this.thesi) : 0;
	x2 = sinedria.hasOwnProperty('thesi') ? parseInt(sinedria.thesi) : 0;
	if (x1 != x2) return true;

	x1 = this.hasOwnProperty('theatis') ? (this.theatis ? 1 : 0) : 0;
	x2 = sinedria.hasOwnProperty('theatis') ? (sinedria.theatis ? 1 : 0) : 0;
	return(x1 != x2);
}

Sinedria.prototype.sinedriaThesiSame = function(sinedria) {
	return !this.sinedriaThesiDif(sinedria);
}
